package com.manxi.mall.service;

import com.manxi.mall.bean.TrafficUvCt;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @author Addroc
 * @date 2024/6/14
 * 流量域统计Service接口
 * 提供电商平台流量相关的统计分析功能
 */
public interface TrafficStatsService {

    /**
     * 获取某天各个渠道的独立访客（UV）数量
     * 用于分析各渠道的用户获取效果
     * @param date 日期参数，格式为yyyyMMdd
     * @param limit 返回的渠道数量限制，用于控制返回的Top N渠道
     * @return 返回各渠道UV数量列表，按UV数量降序排列
     */
    List<TrafficUvCt> getChUvCt(Integer date, Integer limit);

    /**
     * 获取某天各个地区的独立访客（UV）数量
     * 用于分析用户地域分布情况
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回各地区UV数量列表，按UV数量降序排列
     */
    List<TrafficUvCt> getRegionUvCt(Integer date);

    /**
     * 获取某天各个设备的独立访客（UV）数量
     * 用于分析用户设备使用情况，如PC、Mobile、Tablet等
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回各设备UV数量列表，按UV数量降序排列
     */
    List<TrafficUvCt> getDeviceUvCt(Integer date);

    /**
     * 获取某天各个页面的浏览量（PV）数量
     * 用于分析页面访问热度和用户浏览行为
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回各页面PV数量列表，按PV数量降序排列
     */
    List<TrafficUvCt> getPagePvCt(Integer date);

    /**
     * 获取某天的总PV（页面浏览量）数量
     * 用于分析网站整体流量情况
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回总PV数量
     */
    Long getTotalPv(Integer date);

    /**
     * 获取某天的总UV（独立访客）数量
     * 用于分析网站整体用户访问情况
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回总UV数量
     */
    Long getTotalUv(Integer date);

    /**
     * 获取某天新老访客分布情况
     * 用于分析用户留存和新用户获取情况
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回新老访客UV数量列表
     */
    List<TrafficUvCt> getNewOldUvCt(Integer date);

    /**
     * 获取某天的会话数量
     * 用于分析用户访问频次和活跃度
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回会话数量
     */
    Long getTotalSession(Integer date);

    /**
     * 获取某天的跳出率统计
     * 用于分析页面质量和用户体验
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回跳出率（百分比）
     */
    BigDecimal getBounceRate(Integer date);

    /**
     * 获取某天各时段的UV分布
     * 用于分析用户访问时间分布规律
     * @param date 日期参数，格式为yyyyMMdd
     * @return 返回各时段UV数量列表
     */
    List<TrafficUvCt> getHourlyUvCt(Integer date);
}